# 专门存放视图函数
# from info.modules.index import index_blu
from flask import g
from flask import request, jsonify
from flask import session
from info.models import User, News, Category  # 分类和新闻是一对多  （模型类分别是Category和News）
from info.utils.common import user_login_data
from info.utils.response_code import RET
from . import index_blu  # 表示在当前目录下找index_blu
# from info import redis_store
# import logging
from flask import current_app
from flask import render_template

# # 用蓝图对象装饰视图函数
# @index_blu.route("/")
# def index():
#     # logging.debug("这是debug内容")
#     # logging.info("这是info内容")
#     # logging.warning("这是warning内容")
#     # logging.error("这是error内容")
#     #
#     # current_app.logger.debug("----这是debug内容----")
#     # current_app.logger.info("----这是info内容----")
#     # current_app.logger.warning("----这是warning内容-----")
#     # current_app.logger.error("----这是error内容-----")
#     return render_template("news/index.html")  # 添加根路由访问视图

# 浏览器窗口左上角的icon图标
@index_blu.route("/favicon.ico")
def get_web_icon():
    # 浏览器在请求页面的时候,会自动做一个get请求 , 请求窗口小图标
    return current_app.send_static_file("news/favicon.ico")

@index_blu.route("/")
# 判断用户是否登录
@user_login_data
def index():
    # 获取用户登录信息
    user = g.user

    # # 获取到当前登录用户的id
    # # session中有user_id值，说明用户已经登录了，如果没有就说明用户没有登录
    # user_id = session.get("user_id")
    # # 通过id获取用户信息
    # user = None
    # if user_id:
    #     # 表示已经获取到user_id，所以此时需要查询用户信息，返回给前端(比如展示右上角昵称信息)
    #     try:
    #         user = User.query.get(user_id)
    #     except Exception as e:
    #         current_app.logger.error(e)

# 展示点击排行的新闻标题
    # 查询点击量在前n位的新闻
    try:
        from info import constants
        news_click = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)  # 请求News表，按倒序排列，点击排行展示的最多新闻数据
    except Exception as e:
        current_app.logger.error(e)

# 新闻首页的分类（导航部分）的展示
    # 查询新闻分类
    try:
        news_category = Category.query.all()  # 分类表Category
    except Exception as e:
        current_app.logger.error(e)

    # # 给用户添加了一些收藏的新闻：
    # from info import db
    # try:
    #     for i in range(60, 130):
    #         user.collection_news.append(News.query.get(i))
    #     db.session.commit()
    # except Exception as e:
    #     current_app.logger.error(e)
    #     db.session.rollback()
    #     return jsonify(errno = RET.DBERR, errmsg = "数据库操作失败")

    data = {
        # 如果user存在就返回user.to_dict(),如果不存在就返回None
        "user": user.to_dict() if user else None,
        "news_click": news_click,  # 新闻的点击排行
        "news_category": news_category  # 新闻首页导航部分
    }
    return render_template("news/index.html", data=data)


"""
(需求)：
1、先实现点击导航的分类，展示对应分类的新闻，并且没有刷新页面，即点击之后前端向后台服务器发起ajax请求，只是获取新闻数据，用GET方式请求
2、分类和新闻是一对多  （模型类分别是Category和News）
3、最新，指的是所有新闻中最新的数据，而不是一个叫“最新”的分类，所有的新闻的category_id字段不会为1 (所属的分类id不会为1， 1是“最新”)
"""
# (步骤)：
# 1、获取参数，前端发送通过GET参数发送
# 2、分页查询新闻表中的新闻(根据分类id，即cid；降序；使用分页查询；查询到的是python的模型对象列表)
# 3、返回新闻数据

@index_blu.route("/news_list")
def news_list():
    """ajax请求新闻列表数据"""
    # 1. 接收参数，前端发送通过get参数发送
    data_dict = request.args
    page = data_dict.get("page", 1)  # 获取当前页码，默认值为1
    cid = data_dict.get("cid", 1)  # 新闻所属分类的id，默认值为1
    per_page = data_dict.get("per_page", 5)  # 每一页的新闻条数，默认5
    try:
        page = int(page)
        per_page = int(per_page)
        cid = int(cid)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno = RET.PARAMERR, errmsg = "参数错误")

    # 2. 获取根据新闻分类获取新闻列表
    filters = [News.status == 0]
    # cid表示为1时候 “最新”
    # 最新，指的是所有新闻中最新的数据，而不是一个叫“最新”的分类
    # 所以如果前端传到后台的新闻分类id是1的话，说明查询数据库的时候只需要按时间最新的顺序，即News.query.filter()这个参数可以不传，直接写News.query.filter().order_by....
    # 而如果不是1，说明不是“最新”，filter()就得写一个参数作为查询条件  News.category_id==cid
    if cid != 1:
        filters.append(News.category_id == cid)  # 添加条件到列表

    try:
        # 开始查询数据库，因为是分页查询，所以使用 .paginate(page, per_page, False) 方法
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page, per_page, False)
        # 状态为flase，表示已经获取完数据了(来自index.js)
        items = paginate.items  # 查询到的第page页的数据(其实是python的模型对象列表)
        currentPage = paginate.page  # 当前页
        totalPage = paginate.pages   # 总页数
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno = RET.DBERR, errmsg = "数据查询失败")

    # 3. 返回数据之前需要把每一个模型对象转换成字典格式，因为js不认识python的模型对象
    newsList = []
    for news in items:  # items有五个值
        newsList.append(news.to_basic_dict())
    # ４. 返回结果
    return jsonify(errno=RET.OK, errmsg="OK", newsList=newsList, totalPage=totalPage, currentPage=currentPage)